<?php
namespace App\Traits;

trait Fun {
    /**
     * 数组的合并，并加上html标识前缀
     * @param array $data
     * @param int $pid
     * @param string $html
     * @param int $level
     * @return array
     */
    public function tree(array $data, int $pid = 0, string $html = '|--', int $level = 0) {
        static $arr = [];
        foreach ($data as $val) {
            if ($pid == $val['parent_id']) {
                $val['html'] = str_repeat($html, $level);// 重复一个字符多少次
                $val['level'] = $level + 1;
                $arr[] = $val;
                $this->tree($data, $val['id'], $html, $val['level']);
            }
        }
        return $arr;
    }

    /**
     * [递归] 通过父类ID获取所有的子类
     * @param array $data [['id'=>1,'parent_id'=>0],['id'=>2,'parent_id'=>1]]
     * @param int $pid
     * @return array
     */
    public function subTree(array $data, int $pid = 0) {
        $arr = [];
        foreach ($data as $item) {
            if ($pid == $item['parent_id']) {
                $item['children'] = $this->subTree($data,$item['id']);
                $arr[] = $item;
            }
        }
        return $arr;
    }

    /**
     * [递归] 通过父类ID获取所有的子类 在进行删除栏目的时候，需要删除当前栏目下的所有子栏目
     * @param array $data [['id'=>1,'parent_id'=>0],['id'=>2,'parent_id'=>1]]
     * @param int $id
     * @return array
     */
    function get_all_child(array $data,int $id){
        $arr = [];
        foreach($data as $v){
            if($v['parent_id'] == $id){
                $arr[] = $v['id'];
                $arr = array_merge($arr,$this->get_all_child($data,$v['id']));
            };
        };
        return $arr;
    }

    /**
     * [递归] 通过子类ID获取所有的父类
     * @param array $data [['id'=>1,'parent_id'=>0],['id'=>2,'parent_id'=>1]]
     * @param int $cid
     * @return array
     */
    function supTree(array $data,int $cid){
        $arr = [];
        foreach ($data as $item){
            if($item['id'] == $cid){
                $item['children'] = $this->supTree($data,$item['parent_id']);
                $arr[] = $item;
            }
        }
        return $arr;
    }

    /**
     * [递归] 获取所有的子分类的ID
     * @param array $data [['id'=>1,'parent_id'=>0],['id'=>2,'parent_id'=>1]]
     * @return array
     */
    function children(array $data)
    {
        $ids = array_column($data,'id');//返回输入数组中某个单一列的值
        $parent_ids = array_column($data,'parent_id');
        $sub = array_diff($ids,$parent_ids);//获取所有的子分类的ID
        $sup = array_diff($ids,$sub);//获取所有的父分类的ID
        return compact("sub", "sup");//创建包含变量名和它们的值的数组
    }

    /**
     * xml转成数组
     * @param $xmlStr string
     * @return array
     */
    private function xmlToArray(string $xmlStr)
    {
        //禁止引用外部xml实体
        libxml_disable_entity_loader(true);
        $xmlString = simplexml_load_string($xmlStr,'SimpleXMLElement', LIBXML_NOCDATA);
        $val = json_decode(json_encode($xmlString),true);
        return $val;
    }

    /**
     * SimpleXMLElement Object转为数组
     * @param $array object
     * @return array
     */
    function object_array($array)
    {
        //对象直接转换
        if (is_object($array)) {
            $array = (array)$array;
        }
        //数组遍历转换
        if (is_array($array)) {
            foreach ($array as $key => $value) {
                $array[$key] = $this->object_array($value);
            }
        }
        return $array;
    }

    function objectToArray($obj)
    {
        //首先判断是否是对象
        $arr = is_object($obj) ? get_object_vars($obj) : $obj;
        if(is_array($arr)) {
            //这里相当于递归了一下，如果子元素还是对象的话继续向下转换
            return array_map(__FUNCTION__, $arr);
        }else {
            return $arr;
        }
    }

    function arrayToObject($arr)
    {
        if(is_array($arr)) {
            return (object)array_map(__FUNCTION__, $arr);
        }else {
            return $arr;
        }
    }

    /**
     * php 获取13位时间戳 与js保持一致
     */
    function getMillisecond() {
        list($t1, $t2) = explode(' ', microtime());
        return (float)sprintf('%.0f',(floatval($t1)+floatval($t2))*1000);
    }

    /**
     * 通过淘宝IP接口获取IP地理位置
     * @param string $ip
     * @return string
     **/
    function getCity(string $ip)
    {
        $url = "http://ip.taobao.com/service/getIpInfo.php?ip=" . $ip;
        $ipInfo = json_decode(file_get_contents($url));
        if ($ipInfo->code == '1') {
            return false;
        }
        return $ipInfo->data->region . $ipInfo->data->city;
    }

    /**
     * 获取过去月份
     * @return array [1,2,3,4,5]
     */
    function getLastMonth()
    {
        $m_data = array();
        for ($i = 0; $i < date("m"); $i++) {
            $m_data[] = $i + 1;
        }
        return $m_data;
    }

    /**
     * 获取过去年份
     * @param $year integer 年
     * @return array [2017,2018,2019]
     */
    function getLastYear($year=2016)
    {
        $y_data = array();
        for($i=$year;$i<date("Y");$i++)
        {
            $y_data[] = $i+1;
        }
        return $y_data;
    }

    /**
     * 获取当月天数
     * @param $date string 日期 2019-09-01
     * @param $type 0天数 1天数数组
     * @return array
     */
    function get_day(string $date, $type = 0)
    {
        if (!is_numeric($date)) {
            $tem = explode("-", $date);//切割日期 得到年份和月份
            $year = $tem["0"];
            $month = $tem["1"];
        } else {
            $year = date('y');
            $month = $date;
        }
        if (in_array($month, [1, 3, 5, 7, 8, 10, 12, '01', '03', '05', '07', '08'])) {
            $day = 31;
        } elseif ($month == 2) {
            if ($year % 400 == 0 || ($year % 4 == 0 && $year % 100 !== 0))//判断是否是闰年
            {
                $day = 29;
            } else {
                $day = 28;
            }
        } else {
            $day = 30;
        }
        if ($type == 1) {
            $days = [];
            for ($i = 1; $i <= $day; $i++) {
                $days[] = $i;//$year."-".$month."-".$i
            }
            $day = $days;
        }
        return $day;
    }


    /**
     * A-Z,AA-ZZ
     * ASCII 65-90 A-Z
     * @param string|int $letter
     * @return array
     */
    function get_letter($letter)
    {
        $data = [];
        if (is_numeric($letter)) {
            for ($i = 0; $i < $letter; $i++) {
                $y = intval($i / 26);
                if ($y >= 1) {
                    $data[$i] = chr($y + 64) . chr($i - $y * 26 + 65);
                } else {
                    $data[$i] = chr($i + 65);
                }
            }
        } else {
            for($i = 'A'; $i != $letter; $i++)
            {
                $data[$i] = $i;
            }
        }
        return $data;
    }
}
